延續昨天的callback function,今天來講講callback function要如何input其他參數吧!
有時候我們想在呼叫callback的時候可以參考到其他的參數進行運算,但是官網上的範例code在撰寫subscriber時總是只讓callback input收到的那個message啊,通常長得像這樣:
in python:
rospy.Subscriber("topic", msg_type, callback)
in c++:
ros::Subscriber sub = n.subscribe("topic", 1000, callback);
而他們所呼叫的callback function就會只input一個參數,也就是傳進來的message物件:
in python:
def callback(data):
rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
in c++:
void callback(const std_msgs::String::ConstPtr& msg){
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
那我們究竟要如何在callback函式後面多加幾個input呢? 就讓我們繼續看下去吧 (´・ω・`)
python版其實超級簡單直觀的,就是把參數加在後面就對了XD,如果需要兩個以上參數的話就需要用()包起來,他會被視為一個list傳入callback中,如下:
#input 一個參數時:
def callback(data, arg):
rospy.loginfo(data, arg)
sub = rospy.Subscriber("topic", message_type, callback, arg)
#input 兩個以上參數時:
def callback(data, args):
arg1 = args[0]
arg2 = args[1]
sub = rospy.Subscriber("topic_name", String, callback, (arg1, arg2))
雖然其實很簡單,但是因為ROS官網沒有這個範例,所以我還是記錄在這邊,供大家和我未來需要用到時做參考。
c++板就沒這麼容易了QQ,官網說明C++版本其實並沒有設計可以提供input參數的方法,網路上有教學可以使用boost::bind()
操作,但是我試過覺得很不方便XD 所以我後來都用物件打包的方式,覺得方便操作又有程式可讀性,推廣給大家參考XD
class Listener
{
private:
int arg1;
bool arg2;
public:
void callback(const std_msgs::String::ConstPtr& msg);
};
//in function def:
void Listener::callback(const std_msgs::String::ConstPtr& msg){
//arg1 and arg2 can be called here
}
//in main function:
Listener listener;
ros::Subscriber sub = n.subscribe("topic", 1000, &Listener::callback, &listener);
當然還是可以使用boost::bind()進行操作啦,不過有興趣的可以自己去看連結XD
http://www.minsung.org/2018/07/passing-arguments-to-python-callback-in-rospy-ros/
http://wiki.ros.org/roscpp_tutorials/Tutorials/UsingClassMethodsAsCallbacks
https://android.developreference.com/article/13485026/ROS+subscribe+callback+-+using+boost%3A%3Abind+with+member+functions